#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTableWidget>
#include <QLabel>
#include <QTimer>
#include <QAction>
#include <QToolBar>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QSplitter>
#include <QScrollArea>
#include <QVBoxLayout>
#include "core/ChannelManager.h"
#include "utils/AlarmManager.h"

namespace ModbusPlexLink {

class LogViewerWidget;
class AlarmWidget;
class ChannelCardWidget;
class DashboardDataWidget;
class MessageLogPanel;

/**
 * @brief 主窗口 - 通道管理界面
 * 
 * 功能：
 * - 显示所有通道的列表
 * - 通道的启动、停止、编辑、删除操作
 * - 配置文件的加载和保存
 */
class MainWindow : public QMainWindow {
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    
private slots:
    // 文件菜单
    void onNewChannel();
    void onLoadConfig();
    void onSaveConfig();
    void onSaveConfigAs();
    void onExit();
    
    // 通道操作
    void onEditChannel();
    void onDeleteChannel();
    void onStartChannel();
    void onStopChannel();
    void onStartAllChannels();
    void onStopAllChannels();
    
    // 帮助菜单
    void onAbout();

    // 工具
    void onShowLogViewer();
    void onShowAlarmManager();
    void onAlarmTriggered(const AlarmEvent& event);

    // 通道管理器信号
    void onChannelCreated(const QString& name);
    void onChannelDeleted(const QString& name);
    void onChannelStateChanged(const QString& name, ChannelState state);
    
    // 界面更新
    // void onChannelTableSelectionChanged();  // 已弃用：使用卡片代替表格
    // void onChannelTableDoubleClicked(int row, int column);  // 已弃用
    void updateChannelTable();
    void updateStatusBar();
    
    // 系统托盘
    void onTrayIconActivated(QSystemTrayIcon::ActivationReason reason);
    void onShowHide();
    void onTrayExit();
    
protected:
    void closeEvent(QCloseEvent *event) override;
    void changeEvent(QEvent *event) override;
    bool eventFilter(QObject* watched, QEvent* event) override;
    
private:
    void setupUi();
    void createActions();
    void createMenus();
    void createToolBar();
    void createStatusBar();
    void createCentralWidget();
    void createSystemTray();
    void applyModernTheme();  // 新增：应用现代化主题

    QString getSelectedChannelName() const;
    Channel* getSelectedChannel() const;  // 新增：获取选中的通道对象
    void selectChannel(Channel* channel);  // 新增：选中通道
    void updateChannelCards();  // 新增：更新通道卡片列表
    void updateActions();
    bool saveConfigIfNeeded();
    void saveConfigWithChannelRestart(const QString& filename);
    
    QString channelStateToString(ChannelState state) const;
    QColor channelStateColor(ChannelState state) const;
    QString getChannelConnectionStatus(Channel* channel) const;
    
    void showTrayMessage(const QString& title, const QString& message);
    void autoStartAllChannels();
    void updateAlarmIndicator();
    
private:
    // 核心对象
    ChannelManager* m_channelManager;
    AlarmManager* m_alarmManager;

    // 新的UI组件
    QSplitter* m_mainSplitter;           // 主分割器（左右）
    QSplitter* m_rightSplitter;          // 右侧分割器（上下）

    // 左侧：通道列表
    QScrollArea* m_channelScrollArea;
    QWidget* m_channelListWidget;
    QVBoxLayout* m_channelListLayout;
    QList<ChannelCardWidget*> m_channelCards;

    // 右上：仪表盘数据
    DashboardDataWidget* m_dashboardWidget;

    // 右下：报文与日志
    MessageLogPanel* m_messageLogPanel;

    // 当前选中的通道
    Channel* m_currentChannel;

    // 旧的UI组件（仅作为独立工具窗口）
    QTableWidget* m_channelTable;  // 已废弃，用卡片替代
    QTimer* m_updateTimer;
    
    // 状态栏
    QLabel* m_statusLabel;
    QLabel* m_channelCountLabel;
    QLabel* m_runningCountLabel;
    QLabel* m_alarmIndicator;
    
    // 菜单和工具栏动作
    QAction* m_newChannelAction;
    QAction* m_loadConfigAction;
    QAction* m_saveConfigAction;
    QAction* m_saveConfigAsAction;
    QAction* m_exitAction;
    
    QAction* m_editChannelAction;
    QAction* m_deleteChannelAction;
    QAction* m_startChannelAction;
    QAction* m_stopChannelAction;
    QAction* m_startAllAction;
    QAction* m_stopAllAction;
    
    QAction* m_aboutAction;
    QAction* m_logViewerAction;
    QAction* m_alarmManagerAction;
    
    // 配置文件
    QString m_currentConfigFile;
    bool m_configModified;
    
    // 系统托盘
    QSystemTrayIcon* m_trayIcon;
    QMenu* m_trayMenu;
    QAction* m_showHideAction;
    QAction* m_trayExitAction;
    
    // 配置选项
    bool m_autoStartChannels;

    // 工具窗口
    LogViewerWidget* m_logViewer;
    AlarmWidget* m_alarmWidget;
};

} // namespace ModbusPlexLink

#endif // MAINWINDOW_H
